package com.louis.test.impl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author XRY
 * @date 2023年06月27日9:39
 */
public class ProxyUtil {
    //目标对象
    private Object target;

    public ProxyUtil(Object target) {
        this.target = target;
    }

    //反回代理对象
    public Object getProxy(){
        //使用Proxy中的newProxyInstance()
        /**
         * Proxy.newProxyInstance()
         * ClassLoader:加载动态生成代理类的类加载器
         * Class<?>[] interfaces:目标对象实现的所有接口的class类型数组
         * InvocationHandler:设置代理对象实现目标对象方法的过程
         */
        //ClassLoader:加载动态生成代理类的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //Class<?>[] interfaces:目标对象实现的所有接口的class类型数组
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //InvocationHandler:设置代理对象实现目标对象方法的过程
        InvocationHandler invocationHandler = new InvocationHandler(){
            /**
             *
             * @param proxy :代理对象
             * @param method :需要重写目标对象的方法
             * @param args：method方法中的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy,
                                 Method method,
                                 Object[] args) throws Throwable {
                System.out.println("[动态代理][日志]" + method.getName() + ", 参数：" + Arrays.toString(args));
                //调用目标的方法
                Object result = method.invoke(target, args);
                System.out.println("[动态代理][日志]" + method.getName() + ", 结果：" + result);
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
